package dictionnaire;

import listes.*;
import arbres.*;
import java.io.*;

public class DicoArbre implements Dictionnaire {
	Arbre<Character> arbre;
	
	public DicoArbre() { // crée un dictionnaire vide
		arbre = new ArbreDC<Character>('#');
	}

	public DicoArbre(String file) throws FileNotFoundException, IOException {
		// crée un dictionnaire à partir d'un fichier de mots
		this();
	    BufferedReader handler = new BufferedReader(new FileReader(file));
	    String ligne;
	    while ((ligne = handler.readLine())!=null) addWords(ligne);
	} 

	private static Liste<String> genListe(Arbre<Character> a, String prefix) {
		// Fonction privée statique qui parcourt récursivement l'arbre a
		// en reconstituant des mots qui commencent par prefix.

    // A COMPLETER...
    
	}
	
	private static void addWord(String s, Arbre<Character> a) {
		// Fonction privée statique qui parcourt récursivement l'arbre a
		// en ajoutant lettre par lettre la chaine s.

    // A COMPLETER...
    
	}
	
	private static void cutWord(String s, Arbre<Character> a, Arbre<Character> pereDuFilsACouper, int filsACouper) {
		// Fonction privée statique qui parcourt récursivement l'arbre a
		// en mémorisant dans le couple (pereDuFilsACouper, filsACouper) la branche à couper.
		// Si la chaine apparaît dans le dictionnaire, alors la branche mémorisée
		// (éventuellement réduite à une feuille) est supprimée.

    // A COMPLETER...
    
	}
	
	private static int nbPoints (Arbre<Character> a) {
		// Fonction privée statique qui parcourt récursivement l'arbre a 
		// en comptant le nombre de points.

    // A COMPLETER...
    
	}

	private static Arbre<Character> sousArbre (String s, Arbre<Character> a) {
		// Fonction privée statique qui parcourt récursivement l'arbre a
		// sur un chemin correspondant à s.
		// Renvoie l'arbre situé au bout du chemin si s apparaît dans a.
		// Renvoie null sinon.

    // A COMPLETER...
    
	}

	public String toString() {
		String res="";
		Liste<String> words = genListe(arbre, "");
		for(int i=0; i<words.size(); i++) res+=words.get(i)+"\n";
		return res;
	}
	
	@Override
	public Dictionnaire addWords(String... words) {
		for(int i=0; i<words.length; i++) addWord(words[i]+'.', arbre);  
		return this;
	}

	@Override
	public Dictionnaire cutWords(String... words) {
		for(int i=0; i<words.length; i++) cutWord(words[i]+'.', arbre, null, -1);  
		return this;
	}

	@Override
	public int size() {
		// il suffit de compter les points
		return nbPoints(arbre);
	}
	
	@Override
	public boolean exists(String word) {
		return sousArbre(word+'.', arbre)!=null;
	}

	@Override
	public Liste<String> commonPrefix(String prefix) {
		Arbre<Character> a = sousArbre(prefix, arbre);
		Liste<String> sufix = (a==null ? new ListeDC<String>() : genListe(a, ""));
		Liste<String> res = new ListeDC<String>();
		for(int i=0; i<sufix.size(); i++) res.add(prefix+sufix.get(i));
		return res;
	}

	public static void main(String[] args) throws Exception {
		DicoArbre d = new DicoArbre();
		System.out.println(d+"("+d.size()+" mots)");
		d = new DicoArbre("Dico_essais.txt");
		System.out.println(d+"("+d.size()+" mots)");
		System.out.println(d.arbre);
		System.out.println(d.addWords("visée", "vue", "xylophone", "trivial", "tueur")+"("+d.size()+" mots)");
		System.out.println(d.cutWords("vue", "vue", "yyy")+"("+d.size()+" mots)");
		System.out.println("\"vue\" présent ? "+d.exists("vue"));
		System.out.println("\"à\" présent ? "+d.exists("à"));
		System.out.println("Mots commentçant par \"t\" : "+d.commonPrefix("t"));
		System.out.println("Mots commentçant par \"tr\" : "+d.commonPrefix("tr"));
		System.out.println("Mots commentçant par \"tra\" : "+d.commonPrefix("tra"));
		System.out.println("Mots commentçant par \"travers\" : "+d.commonPrefix("travers"));
		System.out.println("Mots commentçant par \"traverse\" : "+d.commonPrefix("traverse"));
		System.out.println("Mots commentçant par \"traversent\" : "+d.commonPrefix("traversent"));
		System.out.println("#########################");
		long topDepart = java.lang.management.ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
		d = new DicoArbre("Dico_enorme.txt");
		System.out.println(d.size()+" mots");
		long topArrivee = java.lang.management.ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
		System.out.println("Temps d'exécution : "+((topArrivee-topDepart)/1000000.0)+" ms");
		topDepart = java.lang.management.ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
		System.out.println("\"vue\" présent ? "+d.exists("vue"));
		System.out.println("\"XWXWX\" présent ? "+d.exists("XWXWX"));
		topArrivee = java.lang.management.ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
		System.out.println("Temps d'exécution : "+((topArrivee-topDepart)/1000000.0)+" ms");
		topDepart = java.lang.management.ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
		Liste<String> ltrav = d.commonPrefix("trav");
		System.out.println(ltrav.size()+" mots commençant par \"trav\" "+ltrav);
		topArrivee = java.lang.management.ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime();
		System.out.println("Temps d'exécution : "+((topArrivee-topDepart)/1000000.0)+" ms");
		/*
			(0 mots)
			abandonner
			agiter
			ah
			aide
			combat
			combien
			depuis
			dernier
			engager
			enlever
			flot
			marier
			mouvement
			oncle
			prochain
			travers
			traverser
			vue
			y
			yeux
			à
			(21 mots)
			#                                        
			+-------+---+---+---+-+---+-+-+---+-+---+
			a       c   d   e   f m   o p t   v y   à
			+-+-+-+ |   |   |   | +-+ | | |   | +-+ |
			b g h i o   e   n   l a o n r r   u . e .
			| | | | |   +-+ +-+ | | | | | |   |   |  
			a i . d m   p r g l o r u c o a   e   u  
			| |   | |   | | | | | | | | | |   |   |  
			n t   e b   u n a e t i v l c v   .   x  
			| |   | +-+ | | | | | | | | | |       |  
			d e   . a i i i g v . e e e h e       .  
			| |     | | | | | |   | | | | |          
			o r     t e s e e e   r m . a r          
			| |     | | | | | |   | |   | |          
			n .     . n . r r r   . e   i s          
			|         |   | | |     |   | +-+        
			n         .   . . .     n   n . e        
			|                       |   |   |        
			e                       t   .   r        
			|                       |       |        
			r                       .       .        
			|                                        
			.                                        
			
			abandonner
			agiter
			ah
			aide
			combat
			combien
			depuis
			dernier
			engager
			enlever
			flot
			marier
			mouvement
			oncle
			prochain
			travers
			traverser
			trivial
			tueur
			visée
			vue
			xylophone
			y
			yeux
			à
			(25 mots)
			abandonner
			agiter
			ah
			aide
			combat
			combien
			depuis
			dernier
			engager
			enlever
			flot
			marier
			mouvement
			oncle
			prochain
			travers
			traverser
			trivial
			tueur
			visée
			xylophone
			y
			yeux
			à
			(24 mots)
			"vue" présent ? false
			"à" présent ? true
			Mots commentçant par "t" : ( travers traverser trivial tueur )
			Mots commentçant par "tr" : ( travers traverser trivial )
			Mots commentçant par "tra" : ( travers traverser )
			Mots commentçant par "travers" : ( travers traverser )
			Mots commentçant par "traverse" : ( traverser )
			Mots commentçant par "traversent" : ( )
			#########################
			260683 mots
			Temps d'exécution : 764.4049 ms
			"vue" présent ? true
			"XWXWX" présent ? false
			Temps d'exécution : 0.0 ms
			145 mots commençant par "trav" ( travail travailla travaillai travaillaient travaillais travaillait travaillant travaillas travaillasse travaillassent travaillasses travaillassiez travaillassions travaille travaillent travailler travaillera travaillerai travailleraient travaillerais travaillerait travailleras travaillerez travailleriez travaillerions travaillerons travailleront travailles travailleur travailleurs travailleuse travailleuses travaillez travailliez travaillions travaillisme travailliste travaillistes travaillons travailloter travaillâmes travaillât travaillâtes travaillèrent travaillé travaillée travaillées travaillés travaux travelage travelages traveller's travelling travellings travelo travers traversa traversable traversables traversai traversaient traversais traversait traversant traversas traversasse traversassent traversasses traversassiez traversassions traverse traversent traverser traversera traverserai traverseraient traverserais traverserait traverseras traverserez traverseriez traverserions traverserons traverseront traverses traversez traversier traversiers traversiez traversin traversine traversines traversins traversions traversière traversières traversons traversâmes traversât traversâtes traversèrent traversé traversée traversées traversés travertin travesti travestie travesties travestir travestira travestirai travestiraient travestirais travestirait travestiras travestirent travestirez travestiriez travestirions travestirons travestiront travestis travestisme travestismes travestissaient travestissais travestissait travestissant travestisse travestissement travestissements travestissent travestisses travestissez travestissiez travestissions travestissons travestit travestîmes travestît travestîtes traviole travée travées )
			Temps d'exécution : 0.0 ms		 */
	}

}
